import cv2
import numpy as np  





def get_box_81(img_path):
    image = cv2.imdecode(np.fromfile(img_path, dtype=np.uint8), cv2.IMREAD_COLOR)
    gray  = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) 
    ret, thresh = cv2.threshold(gray, 153, 255, 1)  # 二值化
    contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) # 轮廓检测

    box_81 = [] # 存储81个小单元格的左上角坐标和右下角坐标,存储格式为：[(x_l,y_l,x_r,y_r), (), ...] x_l,y_l:左上角坐标；x_r,y_r:右下角坐标
    tag_81 = [] # 标记小单元格中是否有数字，空白格为0，否则为1

    for i in range(len(hierarchy[0])):
        if hierarchy[0][i][3] == 0:  # 81个小单元格的父轮廓都是0
            contour  = contours[i]
            x_l, y_l = contour[:, 0, :].min(axis=0)
            x_r, y_r = contour[:, 0, :].max(axis=0)
            box_81.append(([x_l, y_l, x_r, y_r]))
            tag_81.append(1 if hierarchy[0][i][2] != -1 else 0)

    assert len(box_81) == 81, f"单元格的个数应该为81， 但是实际只检测到{len(box_81)} " 

    return box_81, tag_81



def location(coordinate : tuple, row_index : np.array, column_index : np.array): 
    
    '''
    定位：将指定的单元格坐标转换成在数独棋盘中的位置
    (x_l,y_l,x_r,y_r)  -->  [x, y]
    '''

    y = np.abs(row_index    - coordinate[0]).argmin()
    x = np.abs(column_index - coordinate[1]).argmin()
    return [x, y]
